|
If you can't view the Datasheet, Please click here to try to view without PDF Reader . |
|
Datasheet File OCR Text: |
february 2014 docid022648 rev 1 1/36 AN4031 application note using the stm32f2 and stm32f4 dma controller introduction this application note describes how to use th e stm32f2xx and stm32f4xx direct memory access (dma) controller. the stm32f2xx/f4xx dma controller features, the system architecture, the multi-layer bus matrix and the memory system contribute to provide a high data bandwidth and to develop very low latency response-time software. this application note also describes some tips and tricks to allow de velopers to take full advantage of these features an d ensure correct response times for different peripherals and subsystems. stm32f2xx and stm32f4xx are referred to as ?stm32f2/f4 devices? and the dma controller as ?dma? throughout the document. this application note applies to the products listed in table 1 . this application note should be read in conjunction with the stm32f2/f4 reference manuals (rm0031, rm0090 and rm0368). table 1. applicable products type part numbers microcontrollers stm32f2xx (stm32f205, stm32f207, stm32f215, stm32f217) stm32f4xx (stm32f401, stm32f405, stm32f407, stm32f415, stm32f417, stm32f427, stm32f 429, stm32f437, stm32f439) www.st.com
contents AN4031 2/36 docid022648 rev 1 contents 1 dma controller description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1 dma transfer properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.1 dma streams/channels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.1.2 stream priority . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.1.3 source and destination addresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.1.4 transfer mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.1.5 transfer size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.1.6 incrementing source/destination address . . . . . . . . . . . . . . . . . . . . . . . 11 1.1.7 source and destination data width . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.1.8 transfer types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.1.9 dma fifo mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.1.10 source and destination burst size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.1.11 double-buffer mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.1.12 flow control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.2 setting up a dma transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2 system performance considerations . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.1 multi-layer bus matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.1.1 definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.1.2 round-robin priority scheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.1.3 busmatrix arbitration and dma transfer delays worst case . . . . . . . . . . 20 2.2 dma transfer paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.2.1 dual dma port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.2.2 dma transfer states . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.2.3 dma request arbitration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.3 ahb-to-apb bridge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.3.1 dual ahb-to-apb port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.3.2 ahb-to-apb bridge arbitration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3 how to predict dma latencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.1 dma transfer time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.1.1 default dma transfer timing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.1.2 dma transfer time versus concurrent access . . . . . . . . . . . . . . . . . . . . 28 3.2 examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 docid022648 rev 1 3/36 AN4031 contents 3 3.2.1 adc-to-sram dma transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.2.2 spi full duplex dma transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 4 tips and warnings while programming th e dma controller . . . . . . . . 32 5 conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 6 revision history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 list of tables AN4031 4/36 docid022648 rev 1 list of tables table 1. applicable products . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 table 2. dma1 request mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 table 3. dma2 request mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 table 4. dma1 request mapping for stm32f401 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 table 5. dma2 request mapping for stm32f401 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 table 6. possible burst configurations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 table 7. peripheral port access/transfer time versus dma path used . . . . . . . . . . . . . . . . . . . . . . . 28 table 8. memory port access/transfer time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 table 9. dma peripheral (adc) port transfer latency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 table 10. dma memory (sram) port transfer latency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 table 11. document revision history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 docid022648 rev 1 5/36 AN4031 list of figures 5 list of figures figure 1. dma block diagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 figure 2. channel selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 figure 3. dma source address and destination address incr ementing . . . . . . . . . . . . . . . . . . . . . . . 11 figure 4. fifo structure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 figure 5. dma burst transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 figure 6. double-buffer mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 figure 7. system architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 figure 8. cpu and dma1 request an access to sram1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 figure 9. five masters request sram access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 figure 10. dma transfer delay due to cpu transfer issued by interrupt . . . . . . . . . . . . . . . . . . . . . . . 21 figure 11. dma dual port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 figure 12. peripheral-to-memory transfer stat es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 figure 13. memory-to-peripheral transfer st ates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 figure 14. dma request arbitration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 figure 15. ahb-to-apb1 bridge concurre nt cpu and dma1 access request . . . . . . . . . . . . . . . . . . . 26 figure 16. spi full duplex dma transfer time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 dma controller description AN4031 6/36 docid022648 rev 1 1 dma controller description the dma is an amba advanced high-performa nce bus (ahb) module that features three ahb ports: a slave port for dma programmi ng and two master ports (peripheral and memory ports) that allow the dma to initiate data transfers between different slave modules. the dma allows data transfers to take place in the background, without the intervention of the cortex-mx processor. during this operati on, the main processor can execute other tasks and it is only interrupted when a whole data block is available for processing. large amounts of data can be transferred with no major impact on the system performance. the dma is mainly used to implement central data buffer storage (usually in the system sram) for different peripheral modu les. this solution is less expensive in terms of silicon and power consumption compared to a distributed solution where each peripheral needs to implement it own local data storage. the stm32f2/f4 dma controller takes full advantage of the cortex-mx harvard architecture and the multi-layer bus system in order to ensure very low latency both for dma transfers and for cpu execution/in terrupt event detection/service. 1.1 dma transfer properties a dma transfer is characterized by the following properties: ? dma stream/channel ? stream priority ? source and destination addresses ? transfer mode ? transfer size (only when dma is the flow controller) ? source/destination address incrementing or non-incrementing ? source and destination data width ? transfer type ? fifo mode ? source/destination burst size ? double-buffer mode ? flow control stm32f2/f4 devices embed two dma controllers, and each dma has two port, one peripheral port and one memory port, which can work simultaneously. figure 1 shows the dma block diagram. docid022648 rev 1 7/36 AN4031 dma controller description 35 figure 1. dma block diagram the following subsections provide a detailed de scription of each dma transfer property. 1.1.1 dma streams/channels stm32f2/f4 devices embed two dma controllers, offering up to 16 streams in total (eight per controller), each dedicated to managing memory access requests from one or more peripherals. each stream has up to eight selectable channels (requests) in total. this selection is software-configurable and allows several peripherals to initiate dma requests. figure 2 describes the channel selection for a dedicated stream. ahb master memory port fifo ahb master peripheral port stream 0 fifo stream 1 stream 0 stream 1 fifo stream 2 stream 2 fifo stream 7 stream 7 req_stream0 req_str0_ch0 req_str0_ch1 dma controller fifo stream 3 stream 3 fifo stream 4 stream 4 fifo stream 5 stream 5 fifo stream 6 stream 6 arbiter req_stream1 req_stream2 req_stream3 req_stream4 req_stream5 req_stream6 req_stream7 req_str0_ch7 req_str1_ch0 req_str1_ch1 req_str1_ch7 req_str7_ch0 req_str7_ch1 req_str7_ch7 ahb slave programming interface programming port channel selection ai15945 dma controller description AN4031 8/36 docid022648 rev 1 figure 2. channel selection note: o nly one channel/request can be active at the same time in a stream. more than one enabled dma stream must not serve the same peripheral request. table 2 and table 3 show the possible configurations of dma streams/channels versus peripheral requests for all the supported produc ts except stm32f401, which is described in table 4 and table 5 . req_streamx req_strx_ch7 req_strx_ch6 req_strx_ch5 req_strx_ch4 req_strx_ch3 req_strx_ch2 req_strx_ch1 req_strx_ch0 chsel[2:0] 31 29 27 0 dma_sxcr ai15947 table 2. dma1 request mapping peripheral requests stream 0 stream 1 stream 2 stream 3 stream 4 stream 5 stream 6 stream 7 channel 0 spi3_rx - spi3_rx spi2_rx spi2_tx spi3_tx - spi3_tx channel 1 i2c1_rx - tim7_up tim7_up i2c1_rx i2c1_tx i2c1_tx channel 2 tim4_ch1 - i2s3_ext_ rx tim4_ch2 i2s2_ext_ tx i2s3_ext_ tx tim4_up tim4_ch3 channel 3 i2s3_ext_ rx tim2_up tim2_ch3 i2c3_rx i2s2_ext_ rx i2c3_tx tim2_ch1 tim2_ch2 tim2_ch4 tim2_up tim2_ch4 channel 4 uart5_rx usart3_rx uart4_rx usart3_tx uart4_tx usart2_rx usart2_tx uart5_tx channel 5 uart8_tx (1) uart7_tx (1) tim3_ch4 tim3_up uart7_rx (1) tim3_ch1 tim3_trig tim3_ch2 uart8_rx (1) tim3_ch3 channel 6 tim5_ch3 tim5_up tim5_ch4 tim5_trig tim5_ch1 tim5_ch4 tim5_trig tim5_ch2 - tim5_up - channel 7 - tim6_up i2c2_rx i2c2_rx usart3_tx dac1 dac2 i2c2_tx 1. these requests are available on stm32f42xx and stm32f43xx only. docid022648 rev 1 9/36 AN4031 dma controller description 35 table 4 and table 5 show the possible configurations of dma streams/channels versus peripheral requests for stm32f401 products. table 3. dma2 request mapping peripheral requests stream 0 stream 1 stream 2 stream 3 stream 4 stream 5 stream 6 stream 7 channel 0 adc1 sai1_a (1) tim8_ch1 tim8_ch2 tim8_ch3 sai1_a (1) adc1 sai1_b (1) tim1_ch1 tim1_ch2 tim1_ch3 - channel 1 - dcmi adc2 adc2 sai1_b (1) spi6_tx (1) spi6_rx (1) dcmi channel 2 adc3 adc3 - spi5_rx (1) spi5_tx (1) cryp_out cryp_in hash_in channel 3 spi1_rx - spi1_rx spi1_tx - spi1_tx - - channel 4 spi4_rx (1) spi4_tx (1) usart1_rx sdio - usart1_rx sdio usart1_tx channel 5 - usart6_rx usart6_rx spi4_rx (1) spi4_tx (1) - usart6_tx usart6_tx channel 6 tim1_trig tim1_ch1 tim1_ch2 tim1_ch1 tim1_ch4 tim1_trig tim1_com tim1_up tim1_ch3 - channel 7 - tim8_up tim8_ch1 tim8_ch2 tim8_ch3 spi5_rx (1) spi5_tx (1) tim8_ch4 tim8_trig tim8_com 1. these requests are available on stm32f42xx and stm32f43xx only. table 4. dma1 request mapping for stm32f401 peripheral requests stream 0 stream 1 stream 2 stream 3 stream 4 stream 5 stream 6 stream 7 channel 0 spi3_rx - spi3_rx spi2_rx spi2_tx spi3_tx - spi3_tx channel 1 i2c1_rx i2c 3 _rx - - - i2c1_rx i2c1_tx i2c1_tx channel 2 tim4_ch1 - i2s3_ext_r x tim4_ch2 i2s2_ext_tx i2s3_ext_tx tim4_up tim4_ch3 channel 3 i2s3_ext_rx tim2_up tim2_ch3 i2c3_rx i2s2_ext_r x i2c3_tx tim2_ch1 tim2_ch2 tim2_ch4 tim2_up tim2_ch4 channel 4 ----- usart2_rx usart2_tx - channel 5 -- tim3_ch4 tim3_up - tim3_ch1 tim3_trig tim3_ch2 - tim3_ch3 channel 6 tim5_ch3 tim5_up tim5_ch4 tim5_trig tim5_ch1 tim5_ch4 tim5_trig tim5_ch2 i2c 3 _tx tim5_up - channel 7 -- i2c2_rx i2c2_rx --- i2c2_tx dma controller description AN4031 10/36 docid022648 rev 1 stm32f2/f4 dma request mapping is designed in such a way that the software application has more flexibility to map each dma request for the associated peripher al request, and that most of the use case applications are covered by multiplexing the corresponding dma streams and channels. 1.1.2 stream priority each dma port has an arbiter for handling the priority between other dma streams. stream priority is software-configurable (there are four software levels). if two or more dma streams have the same software priority level, the hardware priority is used (stream 0 has priority over stream 1, etc.). 1.1.3 source and destination addresses a dma transfer is defined by a source address and a destination address. both the source and destination should be in the ahb or a pb memory ranges and should be aligned to transfer size. 1.1.4 transfer mode dma is capable of performing three different transfer modes: ? peripheral to memory, ? memory to peripheral, ? memory to memory (only dma2 is able to do such transfer, in this mode, the circular and direct modes are not allowed.) table 5. dma2 request mapping for stm32f401 peripheral requests stream 0 stream 1 stream 2 stream 3 stream 4 stream 5 stream 6 stream 7 channel 0 adc1 --- adc1 - tim1_ch1 tim1_ch2 tim1_ch3 - channel 1 -------- channel 2 -------- channel 3 spi1_rx - spi1_rx spi1_tx - spi1_tx -- channel 4 spi4_rx spi4_tx usart1_rx sdio - usart1_rx sdio usart1_tx channel 5 - usart6_rx usart6_rx spi4_rx spi4_tx - usart6_tx usart6_tx channel 6 tim1_trig tim1_ch1 tim1_ch2 tim1_ch1 tim1_ch4 tim1_trig tim1_com tim1_up tim1_ch3 - channel 7 -------- docid022648 rev 1 11/36 AN4031 dma controller description 35 1.1.5 transfer size the transfer size value has to be defined only when the dma is the flow controller. in fact, this value defines the volume of data to be transferred from source to destination. the transfer size is defined by the dma_sxnd tr register value and by the peripheral side data width. depending on the received request (burst or single), the transfer size value is decreased by the amount of the transferred data. 1.1.6 incrementing sour ce/destination address it is possible to configure th e dma to automatically increment the source and/or destination address after each data transfer. figure 3. dma source address and destination address incrementing 1.1.7 source and destination data width data width for source and destination can be defined as: byte (8 bits) half-word (16 bits) word (32 bits) 1.1.8 transfer types ? circular mode: the circular mode is available to handle circular buffers and continuous data flows (the dma_sxndtr register is then reloaded au tomatically with the previously programmed value). ? normal mode: once the dma_sx ndtr register reaches zero, the stream is disabled (the en bit in the dma_sxcr register is then equal to 0). 1.1.9 dma fifo mode each stream has an independent 4-word (4 * 32 bits) fifo and the threshold level is software-configurable between 1/4, 1/2, 3/4 or full. the fifo is used to temporarily store data coming from the sour ce before transmitting them to the destination. dma fifo can be enabled or disabled by software; when disabled, the direct mode is used. if dma fifo is enabled, data packing/unpacking and/or burst mode can be used. the configured dma fifo threshold defines the dma memory port request time. 0 6 y 9 d e f g h d e ' 0 $ g d w d w u d q v i h u 6 r x u f h d g g u h v v ' h v w l q d w l r q d g g u h v v , q f u h p h q w l q j g h v w l q d w l r q , q f u h p h q w l q j v r x u f h dma controller description AN4031 12/36 docid022648 rev 1 the dma fifos implemented on stm32f2/f4 devices help to: ? reduce sram access and so give more time for the other masters to access the bus matrix without additional concurrency, ? allow software to do burs t transactions which optimi ze the transfer bandwidth, ? allow packing/unpacking data to adapt source and destination data width with no extra dma access. figure 4. fifo structure source: byte 4 words byte lane 0 byte lane 1 byte lane 2 byte lane 3 1/4 1/2 3/4 full empty b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b 11 b12 b13 b14 b15 destination: word source: byte destination: half-word 4 words byte lane 0 byte lane 1 byte lane 2 byte lane 3 1/4 1/2 3/4 full empty b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b 11 b12 b13 b14 b15 w0 w1 w2 w3 h0 h1 h2 h3 h4 h5 h6 h7 source: half-word destination: word 4 words byte lane 0 byte lane 1 byte lane 2 byte lane 3 1/4 1/2 3/4 full empty h0 w0 w1 w2 w3 h1 h2 h3 h4 h5 h6 h7 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 h7 h6 h5 h4 h3 h2 h1 h0 h7, h6, h5, h4, h3, h2, h1, h0 w3, w2, w1, w0 w3, w2, w1, w0 source: half-word 4-words byte lane 0 byte lane 1 byte lane 2 byte lane 3 1/4 1/2 3/4 full empty destination: byte h7 h6 h5 h4 h3 h2 h1 h0 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b 11 b12 b13 b14 b15 h0 h1 h2 h3 h4 h5 h6 h7 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 ai15951 docid022648 rev 1 13/36 AN4031 dma controller description 35 1.1.10 source and d estination burst size burst transfers are guaranteed by the implemented dma fifos. figure 5. dma burst transfer in response to a burst request from periphera l dma reads/writes the number of data units (data unit can be a word, a half-word, or a byte ) programmed by the burst size (4x, 8x or 16x data unit). the burst size on the dma peripheral port must be set according to the peripheral needs/capabilities. the dma burst size on the memory port and th e fifo threshold configuration must match. this allows the dma stream to have enough data in the fifo when burst transfer on the memory port is started. table 6 shows the possible combinations of memory burst size, fifo threshold configuration and data size. to ensure data coherence, each group of transfers that form a burst is indivisible: ahb transfers are locked and the arbiter of the ahb bus matrix does not remove the dma master?s access rights during the burst transfer sequence. 0 6 y 9 3 h u l s k h u d o u h t x h v w 6 5 $ 0 1 x p e h u r i u h j l v w h u v w r e h w u d q v i h u u h g l q e x u v w % x u v w ' 0 $ w u d q v i h u d 3 h u l s k h u d o : 2 5 ' : 2 5 ' : 2 5 ' : 2 5 ' ' 0 $ 6 w u h d p 6 w u h d p ) , ) 2 dma controller description AN4031 14/36 docid022648 rev 1 1.1.11 double-buffer mode a double-buffer stream works as a regular (single-buffer) stream, with the difference that it has two memory pointers. when the double-buffer mode is enabled, the circular mode is automatically enabled and at each end of tran saction (dma_sxndtr register reach 0), the memory pointers are swapped. this allows the software to process one memory area while the second memory area is being filled/used by the dma transfer. figure 6. double-buffer mode table 6. possible bur st configurations msize fifo level mburst = incr4 m burst = incr8 mburst = incr16 byte 1/4 1 burst of 4 bytes forbidden forbidden 1/2 2 bursts of 4 bytes 1 burst of 8 bytes 3/4 3 bursts of 4 bytes forbidden full 4 bursts of 4 bytes 2 bursts of 8 bytes 1 burst of 16 bytes half-word 1/4 forbidden forbidden forbidden 1/2 1 burst of 4 half-words 3/4 forbidden full 2 bursts of 4 half-words 1 burst of 8 half-word word 1/4 forbidden forbidden 1/2 3/4 full 1 burst of 4 words 0 6 y 9 0 h p r u \ o r f d w l r q 0 h p r u \ o r f d w l r q ' 0 $ b 6 [ 0 $ 5 ' 0 $ b 6 [ 0 $ 5 ' 0 $ b 6 [ 3 $ 5 & |